home *** CD-ROM | disk | FTP | other *** search
- /*
- * WinLIB
- * Menu handling and manipulation routines
- */
-
- #include <stdlib.h>
- #include <string.h>
- #include "winlib.h"
- #include "internal.h"
- #include "config.h"
-
- int _has_menu, _changed, _cur_item;
-
- void _top_menu_link(void)
- {
- while(_menutree->prev)
- _menutree = _menutree->prev;
- }
-
- void _create_menubar(void)
- {
- int i;
-
- /* We have a menu now! */
- _has_menu = TRUE;
-
- /* Create the new window and make it a panel */
- _menu_win = newwin(1, stdscr->_maxx + 1, 0, 0);
- _menu_pan = new_panel(_menu_win);
-
- /* Draw the inverse border to signify the menu */
- wattron(_menu_win, A_REVERSE);
- for(i = 0; i < stdscr->_maxx + 1; i++)
- mvwaddch(_menu_win, 0, i, ' ');
- wattroff(_menu_win, A_REVERSE);
- }
-
- int _menustruct_length(void)
- {
- return(sizeof(struct _menustruct));
- }
-
- void _add_menu_link(void)
- {
- /* Allocate memory for the new menu structure */
- _menutree->next = (MENU *) malloc(_menustruct_length());
-
- /* And make the next's previous member equal to the current one
- that we just created */
- _menutree->next->prev = _menutree;
- _menutree = _menutree->next;
-
- /* And let it know that this is the end of the chain */
- _menutree->next = NULL;
- }
-
- void _unselect_menu(void)
- {
- _top_menu_link();
-
- while(_menutree->next) {
- wattron(_menu_win, A_REVERSE);
- mvwaddstr(_menu_win, 0, _menutree->x, _menutree->title);
- _menutree = _menutree->next;
- _menutree->selected = FALSE;
- }
-
- _cur_title = 0;
- _cur_item = -1;
-
- if (_showing_menu) {
- del_panel(_menu_area_pan);
- delwin(_menu_area);
- _showing_menu = FALSE;
- }
- }
-
- void _unselect_menubar(void)
- {
- _top_menu_link();
-
- while(_menutree->next) {
- if ((_menutree->selected) &&
- (_cur_title != _menutree->index)) {
- wattron(_menu_win, A_REVERSE);
- mvwaddstr(_menu_win, 0, _menutree->x, _menutree->title);
-
- _menutree->selected = FALSE;
- }
-
- _menutree = _menutree->next;
- }
-
- _cur_item = -1;
- }
-
- void _create_dropdown(void)
- {
- if (!_showing_menu) {
- int i;
-
- _menu_area = newwin(_menutree->items + 1,
- strlen(_menutree->item[0].item) + 2,
- 1, _menutree->x - 1);
- _menu_area_pan = new_panel(_menu_area);
-
- for(i = 0; i < _menu_area->_maxy; i++) {
- mvwaddch(_menu_area, i, 0, ACS_VLINE);
- mvwaddch(_menu_area, i, _menu_area->_maxx, ACS_VLINE);
- }
-
- for(i = 0; i < _menu_area->_maxx; i++)
- mvwaddch(_menu_area, _menu_area->_maxy, i, ACS_HLINE);
-
- mvwaddch(_menu_area, _menu_area->_maxy, 0, ACS_LLCORNER);
- mvwaddch(_menu_area, _menu_area->_maxy, _menu_area->_maxx, ACS_LRCORNER);
-
- for(i = 0; i < _menutree->items; i++)
- mvwaddstr(_menu_area, i, 1, _menutree->item[i].item);
-
- _showing_menu = TRUE;
-
- Win_PlaySound(SOUND_MENUDROP);
- }
- }
-
- void _handle_menu(Gpm_Event *event)
- {
- int found_inside = FALSE;
-
- _top_menu_link();
-
- while(_menutree->next) {
- int sx, ex;
-
- sx = _menutree->x;
- ex = _menutree->x + _menutree->title_len;
-
- if ((event->x >= sx) && (event->x <= ex)) {
- if ((_cur_title != _menutree->index) &&
- (_menutree->selected == FALSE)) {
- wattroff(_menu_win, A_REVERSE);
- mvwaddstr(_menu_win, 0, _menutree->x, _menutree->title);
- wattron(_menu_win, A_REVERSE);
-
- _cur_title = _menutree->index;
- _menutree->selected = TRUE;
-
- if (_showing_menu) {
- del_panel(_menu_area_pan);
- delwin(_menu_area);
- _showing_menu = FALSE;
- }
-
- _create_dropdown();
- }
-
- found_inside = TRUE;
- }
-
- _menutree = _menutree->next;
- }
-
- if (!found_inside)
- _unselect_menu();
- else
- _unselect_menubar();
- }
-
- void _unselect_item(void)
- {
- _top_menu_link();
-
- while(_menutree->next) {
- if (_cur_title == _menutree->index) {
- if (_cur_item != -1) {
- wattroff(_menu_area, A_REVERSE);
- mvwaddstr(_menu_area, _cur_item, 1, _menutree->item[_cur_item].item);
-
- _menutree->item[_cur_item].selected = FALSE;
- }
-
- _cur_item = -1;
-
- return;
- }
-
- _menutree = _menutree->next;
- }
- }
-
- void _handle_menu_selection(Gpm_Event *event)
- {
- _top_menu_link();
-
- while(_menutree->next) {
- if (_cur_title == _menutree->index) {
- int sx, ex;
-
- sx = _menu_area->_begx + 1;
- ex = sx + strlen(_menutree->item[0].item);
-
- if (event->type & (GPM_DOWN | GPM_DRAG)) {
- if ((event->y >= 1) && (event->y <= _menutree->items + 1)) {
- if ((_cur_item != -1) && (_cur_item != event->y - 1)) {
- wattroff(_menu_area, A_REVERSE);
- mvwaddstr(_menu_area, _cur_item, 1, _menutree->item[_cur_item].item);
-
- _menutree->item[_cur_item].selected = FALSE;
- }
-
- _cur_item = event->y - 1;
-
- if (_menutree->item[_cur_item].type == MENU_SELECTABLE) {
- wattron(_menu_area, A_REVERSE);
- mvwaddstr(_menu_area, _cur_item, 1, _menutree->item[_cur_item].item);
- wattroff(_menu_area, A_REVERSE);
- _menutree->item[_cur_item].selected = TRUE;
- }
-
- return;
- }
- } else {
- if (_cur_item != -1) {
- wattroff(_menu_area, A_REVERSE);
- mvwaddstr(_menu_area, _cur_item, 1, _menutree->item[_cur_item].item);
-
- _menutree->item[_cur_item].selected = FALSE;
- }
-
- if (_menutree->item[_cur_item].function) {
- Win_PlaySound(SOUND_MENUSEL);
- (_menutree->item[_cur_item].function)();
- }
-
- _unselect_menu();
-
- _cur_item = -1;
- _cur_title = 0;
-
- return;
- }
- }
-
- _menutree = _menutree->next;
- }
- }
-
- int Menu_AddTitle(char *title)
- {
- if (!_has_menu) {
- /* Create a menubar */
- _create_menubar();
-
- /* Allocate our menutree stuff */
- _menutree->title = (char *) malloc(strlen(title));
- _menutree->x = 1;
- _menutree->title_len = strlen(title);
- _menutree->index = 0;
- _menutree->items = 0;
- _menutree->selected = FALSE;
-
- /* Copy the menu title to the menu tree and the menu pointer */
- strcpy(_menutree->title, title);
-
- /* Add the first option in that menu */
- wattron(_menu_win, A_REVERSE);
- mvwaddstr(_menu_win, 0, _menutree->x, _menutree->title);
- wattroff(_menu_win, A_REVERSE);
-
- /* Make this the first physical menu index */
- _menutree->index = 1;
-
- /* Add the menu item to our internal menu pointer */
- _add_menu_link();
-
- /* Change the library to know we have a menu */
- _has_menu = TRUE;
-
- /* And return the index */
- return(1);
- }
-
- if (_menutree->prev) {
- int idx;
-
- /* Allocate memory, copy and set defaults */
- _menutree->title = (char *) malloc(strlen(title));
- _menutree->title_len = strlen(title);
- _menutree->index = 0;
- _menutree->items = 0;
- _menutree->selected = FALSE;
- strcpy(_menutree->title, title);
-
- /* Calculate this new menu item's X position */
- _menutree->x = _menutree->prev->x + _menutree->prev->title_len;
-
- /* And draw this new item on the menubar */
- wattron(_menu_win, A_REVERSE);
- mvwaddstr(_menu_win, 0, _menutree->x, _menutree->title);
- wattroff(_menu_win, A_REVERSE);
-
- /* Increase the previous index and make it this one */
- idx = _menutree->prev->index + 1;
- _menutree->index = idx;
-
- /* And add it to the link again */
- _add_menu_link();
-
- /* And return the index */
- return(idx);
- }
-
- /* Whoops! Some other error! */
- return(0);
- }
-
- int Menu_AddItem(int index, char *item, int type, void *function)
- {
- _top_menu_link();
-
- while(_menutree->next) {
- if (_menutree->index == index) {
- int x;
-
- x = _menutree->items;
- _menutree->item[x].item = malloc(strlen(item));
-
- strcpy(_menutree->item[x].item, item);
- _menutree->item[x].type = type;
- _menutree->item[x].selected = FALSE;
-
- _menutree->item[x].function = (function != NULL) ? function : NULL;
-
- _menutree->items++;
-
- return(x);
- }
-
- _menutree = _menutree->next;
- }
-
- return(-1);
- }
-
- int Menu_AddCheck(int index, char *str, int checked)
- {
- _top_menu_link();
-
- while(_menutree->next) {
- if (_menutree->index == index) {
- int x;
-
- for (x = 0; x < _menutree->items; x++) {
- if (strstr(_menutree->item[x].item, str)) {
- if ((_menutree->item[x].item[1] == '*') && (checked == FALSE)) {
- _menutree->item[x].item[1] = ' ';
- return TRUE;
- }
-
- if ((_menutree->item[x].item[1] == ' ') && (checked)) {
- _menutree->item[x].item[1] = '*';
- return TRUE;
- }
- }
- }
-
- return FALSE;
- }
-
- _menutree = _menutree->next;
- }
-
- return FALSE;
- }
-